using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Serialization;

// 战利品系统类
public class LootSystem : MonoBehaviour
{
    // 普通道具列表
    public List<BasicItem> basicItems;
    // 消耗品列表
    public List<Item> consumables;
    // 增强道具列表
    public List<PowerUpItem> powerUpItems;
    // Boss功能道具列表
    public List<Item> functionItems;
    public ItemManager itemManager;
    public Player player;
    public DistortionProbability distortionProbability;

    void Start()
    {
        itemManager = GetComponent<ItemManager>();
        if(itemManager == null) Debug.LogError("Lootsystem的Item manager not found");
        // 检查并初始化所有引用
        if (distortionProbability == null)
        {
            distortionProbability = GetComponent<DistortionProbability>();
            if (distortionProbability == null)
            {
                Debug.LogError("DistortionProbability 对象未初始化！");
            }
            
            //basicItems=itemManager.basicItems;
        }

        if (basicItems == null || basicItems.Count == 0)
        {
            Debug.LogError("没有可用的基础道具或基础道具列表为空！");
        }

        if (consumables == null || consumables.Count == 0)
        {
            Debug.LogError("没有可用的消耗品或消耗品列表为空！");
        }

        if (powerUpItems == null || powerUpItems.Count == 0)
        {
            Debug.LogError("没有可用的增强道具或增强道具列表为空！");
        }

        if (functionItems == null || functionItems.Count == 0)
        {
            Debug.LogError("没有可用的功能道具或功能道具列表为空！");
        }
    }


    // 根据玩家的失真等级生成战利品
    public Item GenerateCommonChestLoot(int distortionLevel)
    {
        // 计算概率，根据失真度影响战利品的质量
        float chance = Random.Range(0f, 1f);

        if (chance <= 0.8)
        {
            // 10% 概率生成（powerup外面暂时挂载的是diy的
            if (powerUpItems != null && powerUpItems.Count > 0)
            {
                return GenerateRewardChestLoot((int)player.stats.distortionLevel);
            }
            else
            {
                Debug.LogError("没有可用的消耗品或消耗品列表为空！");
                return null;
            }
        }
        else
        {
            // 90% 概率生成基础道具 //外面暂时挂载的是消耗品 
            List<LootItems> basicItemOptions = distortionProbability.GetBasicItemsByDistortionLevel(distortionLevel);
            if (basicItemOptions != null && basicItemOptions.Count > 0)
            {
                float randomValue = Random.Range(0f, 1f);
                float cumulativeProbability = 0f; // 累计概率

                foreach (LootItems basicItem in basicItemOptions)
                {
                    cumulativeProbability += basicItem.Probability;

                    if (randomValue <= cumulativeProbability)
                    {
                        // 找到对应的道具并返回
                        return basicItems.Find(item => item.code == basicItem.ItemCode);
                    }
                }

                Debug.LogError("没有找到匹配的基础道具！");
                return null;
            }
            else
            {
                Debug.LogError("没有可用的基础道具选项或失真概率返回为空！");
                return null;
            }
        }
    }

    // 生成商店战利品(生成商品)
    //逐个生成 一次方法生一个
    public Item GenerateShopLoot(int distortionLevel)
    {
        // 计算概率，根据失真度影响战利品（商品）的质量
        float chance = Random.Range(0f, 1f);
        if (chance <= 0.4f)
        {
            // 40% 概率生成基础道具
            List<LootItems> basicItemOptions = distortionProbability.GetBasicItemsByDistortionLevel(distortionLevel);
            float randomValue = Random.Range(0f, 1f);
            float cumulativeProbability = 0f;//累计概率
            
            //概率累加 选择对应道具
            foreach (LootItems option in basicItemOptions)
            {
                cumulativeProbability += option.Probability;
                if (randomValue <= cumulativeProbability)
                {
                    // 找到对应的道具并返回
                    return basicItems.Find(item => item.code == option.ItemCode);//找到对应道具的编号
                }
            }
            return null;
        }
        else if (chance <= 0.8f)
        {
            // 40% 概率生成消耗品
            return consumables[Random.Range(0, consumables.Count)];
        }
        else
        {
            
            // 从列表中随机选择一个道具
            int randomIndex = Random.Range(0, powerUpItems.Count);
            PowerUpItem selectedItem = powerUpItems[randomIndex];

            // 返回随机选择的道具对象
            return selectedItem;
            // // 20% 概率生成增强道具
            // string powerUpItemCode = distortionProbability.GetRandomPowerUpItem(distortionLevel);
            // return powerUpItems.Find(item => item.code == powerUpItemCode);
        }
    }

    // 定义boss战利品选择的结构体
    public class BossLootChoice
    {
        public Item Item { get; set; }
        public bool IsSelectable { get; set; }

        public BossLootChoice(Item item, bool isSelectable)
        {
            Item = item;
            IsSelectable = isSelectable;
            
        }
    }
    
    // 生成奖励战利品
    public Item GenerateRewardChestLoot(int distortionLevel)
    {
        // 100% 生成增强道具
        
        // 从列表中随机选择一个道具
        int randomIndex = Random.Range(0, powerUpItems.Count);
        PowerUpItem selectedItem = powerUpItems[randomIndex];

        // 返回随机选择的道具对象
        return selectedItem;
        // string powerUpItemCode = distortionProbability.GetRandomPowerUpItem(distortionLevel);
        // return powerUpItems.Find(item => item.code == powerUpItemCode);
    }

   // 生成Boss战利品，三选一：其中一个为Boss专属道具，其余为50%功能道具、50%增强道具
   public List<BossLootChoice> GenerateBossLootChoices(Player player, FunctionalItem bossSpecificItem, int distortionLevel)
   {
       List<BossLootChoice> lootChoices = new List<BossLootChoice>();//返回该列表 里面会有三个道具

       // todo:Boss专属功能道具是否可选 
       // 检测玩家背包是否有该Boss专属功能道具  ==>bossSpecificItem
       // bool isBossItemSelectable = !player.HasItem(bossSpecificItem);
       bool isBossItemSelectable = false;

       // 如果玩家未拥有Boss专属功能道具，将其作为一个选择项，否则为就没有这个选项
       //lootChoices.Add(new BossLootChoice(bossSpecificItem, isBossItemSelectable));

       // 生成另外两(或三)个选择项：50%功能道具、50%增强道具
       while (lootChoices.Count < 3)
       {
           float chance = Random.Range(0f, 1f);
           if (chance <= 0.5f)
           {
               // 随机选择其他Boss功能道具
               List<Item> otherBossItems = functionItems.Where(item => item != bossSpecificItem).ToList();
               
               if (otherBossItems.Count > 0)
               {
                   string functionalItemCode = distortionProbability.GetRandomFunctionalItem(distortionLevel);
                   lootChoices.Add(new BossLootChoice(otherBossItems.Find(item => item.code == functionalItemCode), true));
               }
               else
               {
                   // 如果没有其他功能道具，选择增强道具
                   string powerUpItemCode = distortionProbability.GetRandomPowerUpItem(distortionLevel);
                   lootChoices.Add(new BossLootChoice(powerUpItems.Find(item => item.code == powerUpItemCode), true));
               }
           }
           else
           {
               // 随机选择增强道具
               string powerUpItemCode = distortionProbability.GetRandomPowerUpItem(distortionLevel);
               lootChoices.Add(new BossLootChoice(powerUpItems.Find(item => item.code == powerUpItemCode), true));
           }
       }

       // 返回生成的战利品选择列表（3个）
       return lootChoices;
   }
}
